"""
Django管理命令：将validation_result表迁移到OCR_CER_AUDIT_ADMIN数据库
使用方法: python manage.py migrate_to_ocr_cer_audit_admin
"""

import os
import django
from django.core.management.base import BaseCommand, CommandError
from django.db import connection, connections
from django.conf import settings

class Command(BaseCommand):
    help = '将validation_result表迁移到OCR_CER_AUDIT_ADMIN数据库'

    def add_arguments(self, parser):
        parser.add_argument(
            '--source-db',
            type=str,
            help='源数据库名称（默认为当前数据库）',
        )
        parser.add_argument(
            '--with-data',
            action='store_true',
            help='是否同时迁移数据（默认只创建表结构）',
        )

    def handle(self, *args, **options):
        source_db = options.get('source_db', None)
        with_data = options.get('with_data', False)
        
        self.stdout.write(self.style.SUCCESS('开始迁移validation_result表到OCR_CER_AUDIT_ADMIN数据库...'))
        
        try:
            # 创建目标数据库
            self.create_target_database()
            
            # 创建表结构
            self.create_table_structure()
            
            # 如果需要，迁移数据
            if with_data:
                self.migrate_data(source_db)
                
            self.stdout.write(self.style.SUCCESS('迁移完成！'))
            
        except Exception as e:
            self.stdout.write(self.style.ERROR(f'迁移失败: {str(e)}'))
            raise CommandError(f'迁移过程中发生错误: {str(e)}')

    def create_target_database(self):
        """创建目标数据库（如果不存在）"""
        self.stdout.write('正在创建目标数据库OCR_CER_AUDIT_ADMIN...')
        
        with connection.cursor() as cursor:
            cursor.execute("""
                CREATE DATABASE IF NOT EXISTS OCR_CER_AUDIT_ADMIN 
                CHARACTER SET utf8mb4 
                COLLATE utf8mb4_0900_ai_ci
            """)
            
        self.stdout.write(self.style.SUCCESS('目标数据库创建成功或已存在'))

    def create_table_structure(self):
        """在目标数据库中创建表结构"""
        self.stdout.write('正在创建validation_result表结构...')
        
        # 获取目标数据库连接
        target_connection = connections['default']  # 使用默认连接，但会切换数据库
        
        with target_connection.cursor() as cursor:
            # 切换到目标数据库
            cursor.execute("USE OCR_CER_AUDIT_ADMIN")
            
            # 创建表
            cursor.execute("""
                CREATE TABLE `validation_result` (
                  `id` bigint NOT NULL AUTO_INCREMENT,
                  `user_id` varchar(50) NOT NULL COMMENT '用户ID',
                  `code` varchar(50) NOT NULL COMMENT '单据号',
                  `if_pass` tinyint(1) NOT NULL COMMENT '是否通过：true-通过，false-未通过',
                  `val_result` json NOT NULL COMMENT '校验概览结果（JSON格式）',
                  `error_msg` json DEFAULT NULL COMMENT '详细错误信息（JSON格式）',
                  `push_time` datetime NOT NULL COMMENT '推送时间',
                  `created_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                  `updated_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
                  PRIMARY KEY (`id`),
                  UNIQUE KEY `uk_user_code` (`user_id`,`code`),
                  KEY `idx_push_time` (`push_time`),
                  KEY `idx_user_time` (`user_id`,`push_time`)
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='OCR制证校验结果表'
            """)
            
        self.stdout.write(self.style.SUCCESS('表结构创建成功'))

    def migrate_data(self, source_db):
        """从源数据库迁移数据"""
        self.stdout.write('正在迁移数据...')
        
        if not source_db:
            self.stdout.write(self.style.WARNING('未指定源数据库名称，跳过数据迁移'))
            return
            
        with connection.cursor() as cursor:
            # 获取源数据
            cursor.execute(f"SELECT COUNT(*) FROM {source_db}.validation_result")
            source_count = cursor.fetchone()[0]
            
            if source_count == 0:
                self.stdout.write(self.style.WARNING('源表中没有数据，跳过数据迁移'))
                return
                
            # 执行数据迁移
            cursor.execute(f"""
                INSERT INTO OCR_CER_AUDIT_ADMIN.validation_result 
                SELECT * FROM {source_db}.validation_result
            """)
            
            # 验证迁移结果
            cursor.execute("SELECT COUNT(*) FROM OCR_CER_AUDIT_ADMIN.validation_result")
            target_count = cursor.fetchone()[0]
            
            if source_count == target_count:
                self.stdout.write(self.style.SUCCESS(f'数据迁移成功，共迁移 {target_count} 条记录'))
            else:
                self.stdout.write(self.style.ERROR(f'数据迁移不完整：源表 {source_count} 条，目标表 {target_count} 条'))
                raise Exception('数据迁移不完整')